#include <iostream>
#include <fstream>
#include <string>
#include <cerrno>
#include <filesystem>


using std::cout;
using std::cin;
using std::endl;
using std::boolalpha; //c++标准库中的操纵符，用于true false 和 1 0的转换
using std::ofstream;
using std::ifstream;
using std::string;
using std::hex;
using std::getline;
using std::cerr;
namespace fs = std::filesystem;

/**
 * bool值被编译器解读为true：1  false：0，
 * 不能直接通过获取键盘输入true或false赋值，一般使用int进行强制转换
 */
void out_put_2_console()
{
    cout << "please enter bool value 1 or 0: "<<endl;
    bool x = false;
    int a;
    cin >> a;
    x = a;
    /**
     * 还有一些操纵符用于控制输出流的格式
     * 省略std版 hex十六进制  dec十进制  oct八进制
     */
    cout << "you enter "<<boolalpha << x << endl;
    cout << "以16进制打印数字11:  " << hex << 11 << endl;
}

void make_temp_folder() {
    cout << "创建temp目录" << endl;
    fs::create_directory("temp");
}

void output_2_file()
{
    ofstream fs1; // 创建ofstream类型对象, 对象估计有多个构造函数, 这里声明使用的就是默认构造函数
    fs1.open("temp/file1.txt"); //将该对象与文件关联，使用open打开文件是覆盖文件内容
    if (! fs1.is_open()){
        perror("fail to open file");
    }

    /**
     * 创建方法2，std::ios::app表示追加, std::ios::out表示覆盖，默认是覆盖
     * 用cout打印发现是1和16
     */
    ofstream fs2("temp/file2.txt", std::ios::app);
    
    string str1 = "hello world";
    string str2 = "bye world";
    fs1 << str1 << endl;
    fs2 << str2 << str1;
    fs2.close();
    fs1.close();

    cout << "以追加方式打开文件" << endl;
    fs1.open("temp/file1.txt", std::ios::app);
    fs1 << "以追加方式打开文件" << endl;
    cout << "fs1 isopen " << fs1.is_open() <<endl;
    fs1.seekp(0, std::ios::beg); //到达文件开头
    cout << "fs1 isopen " << fs1.is_open() <<endl;
    fs1 << "到达文件开头" << endl;
    fs1.seekp(0, std::ios::end); //到达文件结尾
    cout << "是否到达文件末尾  " << fs1.eof() << endl; //eof函数
    fs1 << "到达文件末尾" << endl;
    fs1.close();



    
    cout<<"std::ios::app is : "<<std::ios::app<<endl;
    cout<<"std::ios::out is : "<<std::ios::out<<endl;
}

void input_from_file()
{
    ifstream if1("inputfile1.txt");
    ofstream of1("temp/outfile1.txt");
    if(if1.is_open()) {
        string line;
        while(getline(if1, line)) {
            cout << line << endl;
            of1 << line << endl;
        }
        if1.close();
        of1.close();
    } else {
        cerr << "failed" <<endl;
    }
}


int main()
{
    make_temp_folder();
    out_put_2_console();
    output_2_file();
    input_from_file();
    return 0;
}